#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2022-11-01 14:06:58
# @Author  : Your Name (you@example.org)
# @Link    : http://example.org
# @Version : $Id$

import time
import touchDriver as t
from machine import Timer
import urandom

#实始化一个点击器控制实例对象
tobj = t.TouchObj()

def randint(min, max):
    span = max - min + 1
    div = 0x3fffffff // span
    offset = urandom.getrandbits(30) // div
    val = min + offset
    # val =  random.randint(min, max)
    return val

#pNumber按键按下,pNumber从0~15
def touchPin(pNumber):
    tobj.setPin(pNumber,False)
    tobj.updateData()
#pNumber按键抬起,pNumber从0~15
def unTouchPin(pNumber):
    tobj.setPin(pNumber,True)
    tobj.updateData()
#按下并抬起,即点按一次
def touchOncePin(pNumber):
    touchPin(pNumber)
    time.sleep_ms(100)  #按下时间为50毫秒
    unTouchPin(pNumber)
    time.sleep_ms(100)  #抬起后再等50毫秒

#使用16位的按键状态数一次控制所有点击头状态
def setAllPinStates(state):
    tobj.set16Pins(state)
    tobj.updateData()

allUntouch = 0b1111111111111111    #所有点击头抬起
danshu     = 0b1010101010101010    #单数按下
shuanshu   = 0b0101010101010101    #双数按下


J1 = 0
J2 = 1
J3 = 2


tim = Timer(-1)  #新建一个虚拟定时器 


runState = 0   #0:开机无动作，1：J1一直点状态，2：j2,j3动作状态
J3Times = 2    #j3按下次数
j3count = J3Times    
#以下为J3
def J3UP(t):
    setAllPinStates(allUntouch) #抬起所有点击头,实际这里是抬起J3
    if j3count <= 0: #j3点击次数完成，退出到停止状态
        stop()
    else: #j3点击次数未完成，接着点下一次
        dt = 500  #J3两次按下间隔时间25ms
        tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J3Down)  #进行接下来的循环
def J3Down(t):
    global j3count
    touchPin(J3)   #点击头J3按下
    j3count -= 1   #j3按下次数-1
    dt = 500     #点击头J1按下时间:25ms
    tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J3UP)
#以下为J2
def J2UP(t):
    setAllPinStates(allUntouch) #抬起所有点击头,实际这里是抬起J2
    dt = 500  #J2抬起后等多久J3按下50ms
    tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J3Down)
def J2Down(t):
    touchPin(J2)   #点击头J2按下
    dt = 500     #点击头J2按下时间:25ms
    tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J2UP)

#以下为J1
def J1UP(t):
    setAllPinStates(allUntouch) #抬起所有点击头,实际这里是抬起J1
    dt = 500  #J1两次按下间隔时间25ms
    tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J1Down)
def J1Down(t):
    touchPin(J1)   #点击头J1按下
    dt = 500     #点击头J1按下时间:25ms
    tim.init(period=dt,mode=Timer.ONE_SHOT ,callback=J1UP)



isRuning = False
def run():
    global j3count,runState
    if runState == 0:#0:开机无动作，1：J1一直点状态，2：j2,j3动作状态
        J1Down(tim)
        runState = 1 
    elif runState == 1:
        tim.deinit()                #关闭定时器
        setAllPinStates(allUntouch) #抬起所有点击头
        j3count = J3Times
        J2Down(tim)

def stop():
    global tim
    tim.deinit()                #关闭定时器
    setAllPinStates(allUntouch) #抬起所有点击头
    runState = 0

def main():
    setAllPinStates(allUntouch)
    time.sleep_ms(100)
    isrun = False                     #按键状态，是否启动
    while True:  #无限循环
        tkey = tobj.key.value()
        if not tkey:
            print('key down')
            run()
            time.sleep_ms(1000)
        else:
            time.sleep_ms(1)
            
if __name__ == '__main__':
    main()
